Web Development Introduction গাইড ও নোট

258

AtomicReference হল Java-এর java.util.concurrent.atomic প্যাকেজের একটি ক্লাস যা reference types এর উপর atomic operations সম্পাদন করতে ব্যবহৃত হয়। এটি একাধিক থ্রেডের মধ্যে reference variables (যেমন, objects, arrays, etc.) নিরাপদভাবে পরিচালনা করতে সাহায্য করে এবং thread safety নিশ্চিত করে।

এটি একটি generic class যা ডেটা টাইপের উপর কাজ করতে সক্ষম, এবং একই সময়ে একাধিক থ্রেড দ্বারা অ্যাক্সেস বা পরিবর্তন করা হলে ডেটার সঠিকতা এবং নিরাপত্তা বজায় রাখে।


AtomicReference এর মূল ধারণা

  • Atomic Operations: AtomicReference প্রতিটি অপারেশনকে atomic বা indivisible (অখণ্ড) বানায়, অর্থাৎ কোনো অপারেশন চলাকালীন অন্য কোনো থ্রেড তার মধ্যে হস্তক্ষেপ করতে পারে না।
  • Thread Safety: একাধিক থ্রেড একই reference variable অ্যাক্সেস বা পরিবর্তন করলেও ডেটা সঠিক থাকে।
  • Generics Support: AtomicReference যেকোনো object reference টাইপের জন্য ব্যবহৃত হতে পারে, যেমন String, Custom Classes, Lists, Maps, ইত্যাদি।

AtomicReference এর বৈশিষ্ট্য

  • Thread-Safe Reference Management: একাধিক থ্রেড যখন একই রেফারেন্স ভ্যারিয়েবলে কাজ করে, তখন এটি ডেটা সুরক্ষিত রাখে।
  • Atomicity: এটি atomic operations সরবরাহ করে, যা অপারেশন চলাকালীন থ্রেডের মধ্যে হস্তক্ষেপ রোধ করে।
  • Non-blocking: লক (lock) বা মিউটেক্স (mutex) ছাড়া কাজ করা যায়, যার ফলে পারফরম্যান্স উন্নত হয়।
  • Compare-and-Set (CAS): এটি atomic compare-and-set অপারেশন সরবরাহ করে, যেখানে একটি থ্রেড একটি রেফারেন্স ভ্যালুকে নতুন ভ্যালু দিয়ে প্রতিস্থাপন করতে পারে, যদি সেটি একটি প্রত্যাশিত মানের সমান হয়।

AtomicReference এর মেথডসমূহ

১. get()

এটি বর্তমান রেফারেন্স ভ্যালু রিটার্ন করে।

T currentValue = atomicReference.get();

২. set(T newValue)

এটি নতুন মান সেট করে।

atomicReference.set(newValue);

৩. compareAndSet(T expected, T newValue)

যদি বর্তমান মান expected এর সমান হয়, তবে এটি newValue দিয়ে আপডেট করে। এটি একটি atomic check-and-set অপারেশন।

boolean isUpdated = atomicReference.compareAndSet(expected, newValue);

৪. getAndSet(T newValue)

এটি বর্তমান মানটি রিটার্ন করে এবং নতুন মান সেট করে।

T oldValue = atomicReference.getAndSet(newValue);

৫. weakCompareAndSet(T expected, T newValue)

compareAndSet এর মতো, তবে এটি একটি অস্থায়ী (weak) সিঙ্ক্রোনাইজেশন ব্যবস্থার মাধ্যমে কাজ করে। এটি পারফরম্যান্সের জন্য উপকারী হতে পারে।


AtomicReference এর ব্যবহার

১. স্টেট পরিবর্তন ট্র্যাকিং (State Change Tracking)

ধরা যাক, একটি অ্যাপ্লিকেশনে একটি নির্দিষ্ট অবস্থা ট্র্যাক করতে হবে যা একাধিক থ্রেড দ্বারা পরিবর্তিত হতে পারে। AtomicReference ব্যবহার করে এই ধরনের স্টেট ম্যানেজমেন্ট করা যায়।

import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceExample {
    public static void main(String[] args) {
        AtomicReference<String> reference = new AtomicReference<>("Initial Value");

        // get() ব্যবহার করে মান পড়া
        System.out.println("Current Value: " + reference.get()); // Output: Initial Value

        // set() ব্যবহার করে নতুন মান সেট করা
        reference.set("Updated Value");
        System.out.println("Updated Value: " + reference.get()); // Output: Updated Value

        // compareAndSet() ব্যবহার করে atomic update করা
        boolean wasUpdated = reference.compareAndSet("Updated Value", "New Value");
        System.out.println("Was updated: " + wasUpdated); // Output: true
        System.out.println("Final Value: " + reference.get()); // Output: New Value
    }
}

২. থ্রেড সিঙ্ক্রোনাইজেশন

একাধিক থ্রেড একযোগে একই রেফারেন্স মান পরিবর্তন করার সময়, AtomicReference ব্যবহার করা হলে race condition এড়ানো সম্ভব হয় এবং ডেটার সঠিকতা নিশ্চিত হয়।

import java.util.concurrent.atomic.AtomicReference;

public class ThreadSafetyExample {
    private static final AtomicReference<Integer> counter = new AtomicReference<>(0);

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> increment());
        Thread t2 = new Thread(() -> increment());

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println("Final Counter: " + counter.get());
    }

    private static void increment() {
        int currentValue;
        do {
            currentValue = counter.get();
        } while (!counter.compareAndSet(currentValue, currentValue + 1));
    }
}

AtomicReference এর সুবিধা

  • Thread Safety: একাধিক থ্রেড ডেটা অ্যাক্সেস করার সময় ডেটা সঠিক থাকে।
  • High Performance: লক-মুক্ত (lock-free) অপারেশন পারফরম্যান্স বাড়ায়।
  • Atomic Operations: প্রতিটি অপারেশন indivisible হওয়ায় race condition প্রতিরোধ করা যায়।
  • Generics Support: এটি যেকোনো object reference টাইপের জন্য ব্যবহৃত হতে পারে, যেমন String, Integer, Custom Objects, ইত্যাদি।

AtomicReference এর সীমাবদ্ধতা

  • Reference Types Only: এটি শুধুমাত্র reference types এর জন্য কাজ করে, প্রিমিটিভ টাইপের জন্য নয়।
  • Atomicity of Reference: এটি কেবলমাত্র রেফারেন্স (object) এর মান পরিবর্তন নিশ্চিত করে, কিন্তু deep equality বা shallow copy এর মধ্যে পার্থক্য করতে পারে না।
  • Limited Scope: যখন খুব বেশি সংখ্যক থ্রেড একসঙ্গে একে অপরের সাথে কাজ করছে, তখন AtomicReference এর কর্মক্ষমতা প্রভাবিত হতে পারে।

উপসংহার

AtomicReference হল একটি অত্যন্ত কার্যকর টুল যা thread-safe reference type ডেটা পরিচালনা করার জন্য ব্যবহৃত হয়। এটি atomic অপারেশন সরবরাহ করে, যা মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে ডেটার সঠিকতা এবং নিরাপত্তা নিশ্চিত করতে সহায়ক। এটি Generics এর সমর্থন দিয়ে ডেভেলপারদের আরো নমনীয়তা প্রদান করে, বিশেষ করে যখন custom objects বা complex data structures ব্যবহৃত হয়।

Content added || updated By
Promotion

Are you sure to start over?

Loading...